package br.com.gemepde.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import br.com.gemepde.dao.AlunoDao;
import br.com.gemepde.database.HibernateUtil;
import br.com.gemepde.domain.Aluno;
import br.com.gemepde.domain.filter.AlunoFilter;

public class AlunoDaoHibernate implements AlunoDao{

	public void salvar(Aluno aluno) {
		Session sessao = null;
		Transaction transacao = null;
		
		try {
			sessao = HibernateUtil.getSessionfactory().openSession();
			transacao = sessao.beginTransaction();
			sessao.save(aluno);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Não foi possível inserir aluno. Mensagem: " + e.getMessage());
		} finally {
			try {
				sessao.close();
			} catch (Throwable e2) {
				System.out.println("Erro ao fechar operação de inserção. Mensagem: " + e2.getMessage());
			}
		}
	}

	public void atualizar(Aluno aluno) {
		Session sessao = null;
		Transaction transacao = null;
		
		try {
			sessao = HibernateUtil.getSessionfactory().openSession();
			transacao = sessao.beginTransaction();
			sessao.update(aluno);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Não foi possível atualizar aluno. Mensagem: " + e.getMessage());
		} finally {
			try {
				sessao.close();
			} catch (Throwable e2) {
				System.out.println("Erro ao fechar operação de atualização. Mensagem: " + e2.getMessage());
			}
		}
	}

	public void excluir(Aluno aluno) {
		Session sessao = null;
		Transaction transacao = null;
		
		try {
			sessao = HibernateUtil.getSessionfactory().openSession();
			transacao = sessao.beginTransaction();
			sessao.delete(aluno);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Não foi possível excluir aluno. Mensagem: " + e.getMessage());
		} finally {
			try {
				sessao.close();
			} catch (Throwable e2) {
				System.out.println("Erro ao fechar operação de exclusão. Mensagem: " + e2.getMessage());
			}
		}
	}

	@SuppressWarnings("unchecked")
	public List<Aluno> encontrarPorFiltro(AlunoFilter filter) {
		
		List<Aluno> resultado = new ArrayList<Aluno>();
		Session sessao = HibernateUtil.getSessionfactory().openSession();
		
		Criteria criteria = sessao.createCriteria(Aluno.class);
		
		if (!filter.getNomeFilter().contentEquals(""))
			criteria.add(Restrictions.like("nome", filter.getNomeFilter(), MatchMode.ANYWHERE));
		
		if (!filter.getMatriculaFilter().contentEquals(""))
			criteria.add(Restrictions.like("matricula", filter.getMatriculaFilter(), MatchMode.END));
		
		resultado = criteria.list();
			
		return resultado;
	}

	public Aluno encontrarUmAluno(Long id) {
		Aluno aluno = new Aluno();
		Session sessao = HibernateUtil.getSessionfactory().openSession();
		
		Criteria criteria = sessao.createCriteria(Aluno.class);
		criteria.add(Restrictions.eq("id", id));
		
		aluno = (Aluno) criteria.uniqueResult();
		
		return aluno;
	}
}
